package JavaCollection;


import org.junit.jupiter.api.Test;

import java.util.*;
import java.util.zip.CheckedOutputStream;

/**
 * @author Lenl
 * @version v1.0
 * @create 2021-06-04 21:58
 * @description 集合框架的概述
 *一、概述
 * 1.集合、数组都是对多个对象进行存储操作的结构，简称Java容器
 *   说明：此时的存储主要指内存层面的存储，不涉及持久化的存储
 * 2.数组在存储多个数据的特点：
 *      >一旦初始化，其长度就确定了
 *      >一旦数组定义好，元素类型就确定了
 *    缺点：长度不可修改；
 *         数组中提供的方法非常有限，增删改很不方便，且效率不高。
 *         获取数组中实际元素的个数无现有属性或方法可用
 *         存储数据的特点：有序、可重复的。无法满足无序、非重复需求
 * 二、集合框架
 *两个体系：Collection:单列数据，存储一个一个对象
 *             List:有序可重复 -->“动态数组”
 *                  |--ArrayList、LinkedList、Vector
 *             Set:无序不可重复-->“高中数学中的集合”
 *                  |--HashSet、LinkedHashSet、TreeSet
 *        Map:双列数据 key-value，存储一对对键值对 -->高中函数 y=f(x)
 *                  |--HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
 *
 * 三、Collection接口中的Api
 *
 */
public class CollectionTest {
    @Test
    public void test1(){
        Collection coll=new ArrayList();
        //1.add()
        coll.add("AA");
        coll.add("BB");
        coll.add(123);
        coll.add(new Date());

        //2.size():获取添加的元素的个数
        System.out.println(coll.size());
        //3.addAll()：添加集合中的元素
        Collection coll1=new ArrayList();
        coll1.add("cc");
        coll1.add("dd");
        coll.addAll(coll1);
        System.out.println(coll.toString());

        //4.isEmpty():判断集合是否为空
        System.out.println(coll.isEmpty());
        //5.clear():清空集合元素
//        coll.clear();
//        System.out.println(coll.isEmpty());

        //6.contains()：
        System.out.println(coll.contains("AA"));//判断的是内容
        coll.add(new Person("tom"));
        //这里比较调用的是equals方法，重写前为false，重写后为true
        //***  因此Collect接口中的实现类需要重写equals方法  ****//
        System.out.println(coll.contains(new Person("tom")));

        //7.containsAll() :判断形参中的数据是否都包含在调用的方法中
        ArrayList alist=new ArrayList();
        alist.add("cc");
        alist.add("dd");
        System.out.println(coll1.containsAll(alist));

        //8.remove() 移除某个元素,移除obj需要该obj重写了equals方法
        System.out.println(coll1.remove("cc")+"移除后："+coll1.toString());

        //9.removeAll() 移除调用元素中，形参与调用集合共有的所有元素。
        coll1.removeAll(alist);
        System.out.println(coll1.toString());

        //10.retainAll() 求交集，并返回给当前集合（修改了当前集合）

        //11.equals(Object obj)
        System.out.println(coll1.equals(alist)); //顺序要看具体实现接口的类是否有序

        //12.hashCode()返回当前对象的哈希值
        System.out.println(coll.hashCode());

        //13.toArray() 集合可以转换为数组
        Object[] arr=coll.toArray();
        System.out.println(Arrays.toString(arr));

        //14.拓展：数组变集合 Arrays.asList()
        List<String> strings = Arrays.asList(new String[]{"aa", "bb", "cc"});
        System.out.println(strings);
        List<Integer> ints = Arrays.asList(new Integer[]{1, 2, 3, 4});
        System.out.println(ints);

        //15.iterator():返回iterator接口的实例，用于遍历集合元素。放在IteratorTest.java中测试


    }
}


class Person{
    private String name;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name);
    }

//    @Override
//    public int hashCode() {
//        return Objects.hash(name);
//    }
}